/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entities;

import entities.interfaces.TraspasoInterfaz;
import java.io.Serializable;
import java.util.List;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author damfercer
 */
@Entity
@Table(name = "peticion_traspaso_mercancia")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "PeticionTraspasoMercancia.findAll", query = "SELECT p FROM PeticionTraspasoMercancia p"),
    @NamedQuery(name = "PeticionTraspasoMercancia.findByIdPeticionTraspasoMercancia", query = "SELECT p FROM PeticionTraspasoMercancia p WHERE p.idPeticionTraspasoMercancia = :idPeticionTraspasoMercancia"),
    @NamedQuery(name = "PeticionTraspasoMercancia.findByFechaCreacion", query = "SELECT p FROM PeticionTraspasoMercancia p WHERE p.fechaCreacion = :fechaCreacion"),
    @NamedQuery(name = "PeticionTraspasoMercancia.findByAlmacen", query = "SELECT p FROM PeticionTraspasoMercancia p WHERE p.almacen.idAlmacen = :idAlmacen"),
    @NamedQuery(name = "PeticionTraspasoMercancia.findByAlmacenes", query = "SELECT p FROM PeticionTraspasoMercancia p WHERE p.almacen IN :almacenes"),
    @NamedQuery(name = "PeticionTraspasoMercancia.findByAlmacenDestino", query = "SELECT DISTINCT lp.peticionTraspasoMercancia FROM LineaPeticionTraspasoMercancia lp WHERE lp.almacenEnvio.idAlmacen = :idAlmacen AND lp.lineaEnvioTraspasoMercanciaList IS EMPTY"),
    @NamedQuery(name = "PeticionTraspasoMercancia.findByAlmacenesDestino", query = "SELECT DISTINCT lp.peticionTraspasoMercancia FROM LineaPeticionTraspasoMercancia lp WHERE lp.almacenEnvio IN :almacenes AND lp.lineaEnvioTraspasoMercanciaList IS EMPTY"),
    @NamedQuery(name = "PeticionTraspasoMercancia.findByImportancia", query = "SELECT p FROM PeticionTraspasoMercancia p WHERE p.importancia = :importancia"),
    @NamedQuery(name = "PeticionTraspasoMercancia.findByComentarios", query = "SELECT p FROM PeticionTraspasoMercancia p WHERE p.comentarios = :comentarios")})
public class PeticionTraspasoMercancia implements Serializable,TraspasoInterfaz {
    @JoinColumn(name = "ALMACEN", referencedColumnName = "ID_ALMACEN")
    @ManyToOne(optional = false)
    private Almacen almacen;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "ID_PETICION_TRASPASO_MERCANCIA")
    private Integer idPeticionTraspasoMercancia;
    @Basic(optional = false)
    @NotNull
    @Column(name = "FECHA_CREACION")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaCreacion;
    @Basic(optional = false)
    @NotNull
    @Column(name = "IMPORTANCIA")
    private int importancia;
    @Size(max = 128)
    @Column(name = "COMENTARIOS")
    private String comentarios;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "peticionTraspasoMercancia")
    private List<LineaPeticionTraspasoMercancia> lineaPeticionTraspasoMercanciaList;
    @JoinColumn(name = "USUARIO_CREADOR", referencedColumnName = "ID_USUARIO")
    @ManyToOne(optional = false)
    private Usuario usuarioCreador;
    @JoinColumn(name = "CLIENTE", referencedColumnName = "ID_CLIENTE")
    @ManyToOne
    private Cliente cliente;

    public PeticionTraspasoMercancia() {
    }

    public PeticionTraspasoMercancia(Integer idPeticionTraspasoMercancia) {
        this.idPeticionTraspasoMercancia = idPeticionTraspasoMercancia;
    }

    public PeticionTraspasoMercancia(Integer idPeticionTraspasoMercancia, Date fechaCreacion, int importancia) {
        this.idPeticionTraspasoMercancia = idPeticionTraspasoMercancia;
        this.fechaCreacion = fechaCreacion;
        this.importancia = importancia;
    }

    public Integer getIdPeticionTraspasoMercancia() {
        return idPeticionTraspasoMercancia;
    }

    public void setIdPeticionTraspasoMercancia(Integer idPeticionTraspasoMercancia) {
        this.idPeticionTraspasoMercancia = idPeticionTraspasoMercancia;
    }

    public Date getFechaCreacion() {
        return fechaCreacion;
    }

    public void setFechaCreacion(Date fechaCreacion) {
        this.fechaCreacion = fechaCreacion;
    }

    public int getImportancia() {
        return importancia;
    }

    public void setImportancia(int importancia) {
        this.importancia = importancia;
    }

    public String getComentarios() {
        return comentarios;
    }

    public void setComentarios(String comentarios) {
        this.comentarios = comentarios;
    }

    @XmlTransient
    public List<LineaPeticionTraspasoMercancia> getLineaPeticionTraspasoMercanciaList() {
        return lineaPeticionTraspasoMercanciaList;
    }

    public void setLineaPeticionTraspasoMercanciaList(List<LineaPeticionTraspasoMercancia> lineaPeticionTraspasoMercanciaList) {
        this.lineaPeticionTraspasoMercanciaList = lineaPeticionTraspasoMercanciaList;
    }

    public Usuario getUsuarioCreador() {
        return usuarioCreador;
    }

    public void setUsuarioCreador(Usuario usuarioCreador) {
        this.usuarioCreador = usuarioCreador;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }
    
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idPeticionTraspasoMercancia != null ? idPeticionTraspasoMercancia.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof PeticionTraspasoMercancia)) {
            return false;
        }
        PeticionTraspasoMercancia other = (PeticionTraspasoMercancia) object;
        if ((this.idPeticionTraspasoMercancia == null && other.idPeticionTraspasoMercancia != null) || (this.idPeticionTraspasoMercancia != null && !this.idPeticionTraspasoMercancia.equals(other.idPeticionTraspasoMercancia))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.PeticionTraspasoMercancia[ idPeticionTraspasoMercancia=" + idPeticionTraspasoMercancia + " ]";
    }

    public Almacen getAlmacen() {
        return almacen;
    }

    public void setAlmacen(Almacen almacen) {
        this.almacen = almacen;
    }
    
    public Integer getCantidad(){
        Integer cantidad=0;
        if(this.lineaPeticionTraspasoMercanciaList!=null){
            for (LineaPeticionTraspasoMercancia lineaPeticionTraspasoMercancia : lineaPeticionTraspasoMercanciaList) {
                cantidad+=lineaPeticionTraspasoMercancia.getCantidad();
            }
        }
        return cantidad;
    }

    @Override
    public Almacen getAlmacenOrigen() {
        return getAlmacen();
    }

    @Override
    public Almacen getAlmacenDestino() {
        return null;
    }

    @Override
    public Date getFecha() {
        return getFechaCreacion();
    }

    @Override
    public String getTipo() {
        return TipoTraspaso.PETICION.toString();
    }

    @Override
    public Integer getUnidades() {
        return getCantidad();
    }
    
    @Override
    public String getId(){
        return getTipo()+getIdPeticionTraspasoMercancia().toString();
    }

    @Override
    public String getEstado() {
        EstadoPeticion estado=EstadoPeticion.NOSERVIDA;
        Boolean todasLasLineasHanSidoServidas=true;
        Boolean incidencia=false;
        if(lineaPeticionTraspasoMercanciaList!=null){
            for (LineaPeticionTraspasoMercancia lineaPeticionTraspasoMercancia : lineaPeticionTraspasoMercanciaList) {
                if(lineaPeticionTraspasoMercancia.getLineaEnvioTraspasoMercanciaList()!=null && !lineaPeticionTraspasoMercancia.getLineaEnvioTraspasoMercanciaList().isEmpty()){
                    if(lineaPeticionTraspasoMercancia.getAlmacenEnvio()==null){
                        incidencia=true;
                        break;
                    }
                    Integer cantidadAcumulada=0;
                    for(LineaEnvioTraspasoMercancia lineaEnvio: lineaPeticionTraspasoMercancia.getLineaEnvioTraspasoMercanciaList()){
                        cantidadAcumulada=cantidadAcumulada+lineaEnvio.getCantidad();
                    }
                    /*if(cantidadAcumulada!=lineaPeticionTraspasoMercancia.getCantidad()){
                        todasLasLineasHanSidoServidas=false;
                        incidencia=true;
                        break;
                    }*/
                }
                else{
                    todasLasLineasHanSidoServidas=false;
                    break;
                }
            }
        }
        if(todasLasLineasHanSidoServidas){
            estado=EstadoPeticion.SERVIDA;
        }
        else if(incidencia){
            estado=EstadoPeticion.INCIDENCIA;
        }
        return estado.toString();
    }
}
